<?php
// +----------------------------------------------------------------------
// | TOPThink [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2010 http://topthink.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi.cn@gmail.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace Com\Wechat;
use SimpleXMLElement;

class ThinkWechat {

	/**
	 * 微信推送过来的数据或响应数据
	 * @var array
	 */
	private $data = array();

	/**
	 * 构造方法，用于实例化微信SDK
	 * @param string $token 微信开放平台设置的TOKEN
	 */
	public function __construct($token){
		
		if(TEST_DEBUG){
			$xml = '<xml><ToUserName><![CDATA[gh_3ad4fed6765c]]></ToUserName>
					<FromUserName><![CDATA[o6XPgjiHYj3D-0aahlBFlbjd-opk]]></FromUserName>
					<CreateTime>1391871712</CreateTime>
					<MsgType><![CDATA[text]]></MsgType>
					<Content><![CDATA[sss]]></Content>
					<MsgId>5978043483467548965</MsgId>
					</xml>';
			$xml = new SimpleXMLElement($xml);
			// 			logs($xml);
			$xml || exit;
			
			foreach ($xml as $key => $value) {
				$this->data[$key] = strval($value);
			}
			
			return ;
			
		}

		if(IS_GET){
			exit($_GET['echostr']);
		} else {
			
			$this->auth($token) || die('token信息错误');
			
			$xml = file_get_contents("php://input");
			
			
			
			$xml = new SimpleXMLElement($xml);
			//logs($xml);
			$xml || exit;

	        foreach ($xml as $key => $value) {
	        	$this->data[$key] = strval($value);
	        }
		}
	}

	/**
	 * 获取微信推送的数据
	 * @return array 转换为数组后的数据
	 */
	public function request(){
       	return $this->data;
	}

	/**
	 * * 响应微信发送的信息（自动回复）
	 * @param  string $to      接收用户名
	 * @param  string $from    发送者用户名
	 * @param  array  $content 回复信息，文本信息为string类型
	 * @param  string $type    消息类型
	 * @param  string $flag    是否新标刚接受到的信息
	 * @return string          XML字符串
	 */
	public function response($content, $type = 'text', $flag = 0){
		/* 基础数据 */
		$this->data = array(
			'ToUserName'   => $this->data['FromUserName'],
			'FromUserName' => $this->data['ToUserName'],
			'CreateTime'   => NOW_TIME,
			'MsgType'      => $type,
		);
		

		
		//判断成员方法是不是存在
		if(!method_exists($this, $type)){
		    return false;
		}
		
		/* 添加类型数据 */
		$this->$type($content);

		/* 添加状态 */
		$this->data['FuncFlag'] = $flag;

		/* 转换数据为XML */
		$xml = new SimpleXMLElement('<xml></xml>');
		$this->data2xml($xml, $this->data);
		
		$res = $xml->asXML();
		
		if(TEST_DEBUG){
			dump($res);
		}
		
		if(APP_DEBUG){
		    //logs($res);
		}
		echo $res;exit;
		exit($xml->asXML());
	}
	
	
	/**
	 * 获取用户的access_token信息
	 */
	public static function access_token($appid,$appsecret){
		
		$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
		
		$status = \Com\Util\Http::request($url);
		
		$res = json_decode($status,true);
		
		if(is_array($res)){
		    return $res;
		}else {
		    return $status;
		}
		
	}
	
	/**
	 * 发布自定义菜单
	 */
	public static function publish_classify($access_token,$data){
	
		$url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$access_token;
	
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$status = curl_exec($ch);
		curl_close($ch);
		
		$res = json_decode($status,true);
		if(is_array($res)){
		    return $res;
		}else {
		    return $status;
		}
		
		
// 		$status = \Com\Util\Http::request($url,$data,'WECHAT');
	
// 		$res = json_decode($status,true);
		
// 		if(is_array($res)){
// 		    return $res;
// 		}else {
// 		    return $status;
// 		}
	
		 
	}
	
	/**
	 * 删除已经发布的自定义菜单
	 */
	public static function delPublishedClassify($access_token){
		$url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$access_token;
		$status = \Com\Util\Http::request($url);
		$res = json_decode($status,true);
		if(is_array($res)){
			return $res;
		}else {
			return $status;
		}
	}
	
	
	

	/**
	 * 回复文本信息
	 * @param  string $content 要回复的信息
	 */
	private function text($content){
		$this->data['Content'] = $content;
	}

	/**
	 * 回复音乐信息
	 * @param  string $content 要回复的音乐
	 */
	private function music($music){
		list(
			$music['Title'], 
			$music['Description'], 
			$music['MusicUrl'], 
			$music['HQMusicUrl']
		) = $music;
		$this->data['Music'] = $music;
	}

	/**
	 * 回复图文信息
	 * @param  string $news 要回复的图文内容
	 */
	private function news($news){
		$articles = array();
		$i = 0;
		foreach ($news as $value) {
			$articles[$i]['Title'] = $value['Title'];
			$articles[$i]['Description'] = $value['BriefDescription'];
			
			$articles[$i]['PicUrl'] = $value['ImgPath'];
			$articles[$i]['Url'] = $value['Url'];
			$i++;
			if($i >= 9) { break; } //最多只允许10调新闻
		}
		
		$this->data['ArticleCount'] = count($articles);
		$this->data['Articles'] = $articles;
	}

	/**
     * 数据XML编码
     * @param  object $xml  XML对象
     * @param  mixed  $data 数据
     * @param  string $item 数字索引时的节点名称
     * @return string
     */
    private function data2xml($xml, $data, $item = 'item') {
        foreach ($data as $key => $value) {
            /* 指定默认的数字key */
            is_numeric($key) && $key = $item;

            /* 添加子元素 */
            if(is_array($value) || is_object($value)){
                $child = $xml->addChild($key);
                $this->data2xml($child, $value, $item);
            } else {
            	if(is_numeric($value)){
            		$child = $xml->addChild($key, $value);
            	} else {
            		$child = $xml->addChild($key);
	                $node  = dom_import_simplexml($child);
				    $node->appendChild($node->ownerDocument->createCDATASection($value));
            	}
            }
        }
    }

    /**
	 * 对数据进行签名认证，确保是微信发送的数据
	 * @param  string $token 微信开放平台设置的TOKEN
	 * @return boolean       true-签名正确，false-签名错误
	 */
	private function auth($token){
		/* 获取数据 */
		$data = array($_GET['timestamp'], $_GET['nonce'], $token);
		$sign = $_GET['signature'];
		
		/* 对数据进行字典排序 */
		sort($data, SORT_STRING);

		/* 生成签名 */
		$signature = sha1(implode($data));

		return $signature === $sign;
	}
	

}
